package com.jdd.common.util.excel;

import com.jdd.common.exception.JddBootException;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author cs
 * @date 2021/10/11 10:26
 */
public class StringNumMathUtil {

    private static final String NO_MONEY = "0";

    public static double add(double v1, double v2) {
        java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1));
        java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    public static double add(String v1, String v2) {
        java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
        java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1, double v2) {
        java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1));
        java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }
    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(String v1, String v2) {
        java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
        java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     *
     * @param v1 因数
     * @param v2 因数
     * @return 两个参数的差
     */
    public static double multiply(String v1, String v2) {
        java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
        java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The   scale   must   be   a   positive   integer   or   zero");
        }
        java.math.BigDecimal b   = new java.math.BigDecimal(Double.toString(v));
        java.math.BigDecimal one = new java.math.BigDecimal("1");
        return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(String v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The   scale   must   be   a   positive   integer   or   zero");
        }
        java.math.BigDecimal b   = new java.math.BigDecimal(v);
        java.math.BigDecimal one = new java.math.BigDecimal("1");
        return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * String类型的数字累加1
     * @param num
     * @return
     */
    public static String addOne(String num){
        return String.valueOf(Integer.parseInt(num)+1);
    }

    /**
     * 这个数字是不是正整数
     * @param withdrawalMoneyNumber
     * @return true: 是正整数，false：不是正整数
     */
    public static boolean isPositiveInteger(String withdrawalMoneyNumber) {
        if(StringUtils.isBlank(withdrawalMoneyNumber)){
            return false;
        }
        BigDecimal number = new BigDecimal(withdrawalMoneyNumber);
        if(number.compareTo(new BigDecimal("0")) == -1){
            return false;
        }
        if (new BigDecimal(number.intValue()).compareTo(number) == 0){
            //整数
            return true;
        }
        // 小数
        return false;
    }

    /**
     * 分转换为元并保留两位小数
     * @example 1000 -> 10; 1 -> 0.01
     * @return  转换成String 的金额
     */
    public static String pointToUnit(String money){
        if(StringUtils.isBlank(money)){
            return "0";
        }
        BigDecimal decimal = new BigDecimal(money);
        // 不能小于1
        if(decimal.compareTo(new BigDecimal(NO_MONEY)) == -1){
            throw new JddBootException("转换的金额不能小于0分！");
        }
        BigDecimal divide = decimal.divide(new BigDecimal("100"));
        double round = StringNumMathUtil.round(divide.toString(), 2);
        return String.valueOf(round);
    }

    /**
     * 将数据除于 1000 再乘以第二个数
     *      注意，顺序是先乘后除，所以使用时请注意顺序问题
     * @example s1 = 111 , s2 = 3
     *             返回值为 111 * 3 / 1000 ，并且返回值会进行四舍五入 0.333 会被舍去，返回 字符串0
     * @param s1 除1000的数
     * @param s2 被乘的数
     * @return 处于1000之后的数据，使用四舍五入，不保留小数 1000 -> 1；100 -> 0
     */
    public static String divideThousandWithRound(String s1,String s2){
        BigDecimal bigFee = new BigDecimal(s1);
        BigDecimal base = new BigDecimal("1000");
        BigDecimal rate = new BigDecimal(s2);
        BigDecimal serviceFee = bigFee.multiply(rate).divide(base);
        Double round = (Double)round(serviceFee.doubleValue(), 0);
        return String.valueOf(round.intValue());
    }

    /***
     * @description 统计list的和
     * @date 2021/10/23 12:08
     * @author liushengnan
     * @param list
     * @return java.lang.String
     */
    public static String getSum(List<String> list){
        BigDecimal bigDecimal = new BigDecimal("0");
        for (String feeStr : list) {
            bigDecimal = bigDecimal.add(new BigDecimal(feeStr));
        }
        return String.valueOf(bigDecimal.toBigInteger());
    }

}
